/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Commons;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;

/**Questa classe implementa il descrittore del task.
 * Al suo interno presenta degli attributi che definiscono
 * l'id del task, il tipo del task, il comando da eseguire
 * e il link alleventuale risorsa da utilizzare per l'esecuzione
 *
 * @author Team5
 */
public class TaskDescriptor implements Serializable{

    public enum TaskTYPE { Executable, scriptBash }

    //Attributes
    private int id;
    private TaskTYPE type;
    private String command;
    private String link;
    private ArrayList<String> Inputs;
    private ArrayList<String> Outputs;

    //Requisiti funzionali
    private int nCPUnecessarie=1;
    private int quantitaMinRamMB=256;
    private int spazioDiscoOccupatoMB=8;
    private ArrayList<String> sistemaOperativo;
     /**STEP 2:
     *  Campo necessario per trasferire le informazioni del vectorClock
     *  necessarie per la gestione dell'ordinamento del logging globale
     */
    private HashMap<Integer,Integer> vectorClock;

    /**Costruttore di default della classe
     *
     */
    public TaskDescriptor() {

        id= (int) (1000*Math.random());
        command="echo ..."+id;
        this.link=null;
        sistemaOperativo=new ArrayList<String>();
        sistemaOperativo.add("Linux");
        sistemaOperativo.add("WindowsXp");
        this.vectorClock= new HashMap<Integer,Integer>();
        
    }

    /**Costruttore con id specifico.
     *
     * @param id id del task
     */
    public TaskDescriptor(int id) {
        this.id=id;
        command="echo ..."+id;
        sistemaOperativo=new ArrayList<String>();
        sistemaOperativo.add("Linux");
        sistemaOperativo.add("WindowsXp");
        this.vectorClock= new HashMap<Integer,Integer>();

    }

    /**Costruttore della classe completo di tutti i parametri
     *
     * @param id id del task
     * @param type
     * @param command
     * @param link
     */
    public TaskDescriptor(int id,TaskTYPE type,String command, String link) {
        this.id=id;
        this.type=type;
        this.command=command;
        this.link=link;
        sistemaOperativo=new ArrayList<String>();
        this.vectorClock= new HashMap<Integer,Integer>();
    }
    //Operations
    /** Il metodo restituisce l'ID del TaskDescriptor
     *
     * @return id del TaskDescriptor
     */
    public int getID(){
        return id;
    }

    /**Il metodo permette di settare l'ID del Task Descriptor
     *
     * @param val id da assegnare al TaskDescriptor
     */
    public void setID(int val){
        id=val;
    }
    /**Il metodo restituisce il tipo di Task
     *
     * @return tipo di Task
     */
    public TaskTYPE getType(){
        return type;
    }

    /**Il metodo setta il tipo di Task
     *
     * @param val tipologia di task
     */
    public void setType(TaskTYPE val){
        this.type=val;
    }

    /**La funzione restituisce il link alla risorsa da utilizzare
     * per l'esecuzione del task
     *
     * @return link restituito
     */
    public String getLink(){
        return this.link;
    }

    /**Il metodo permette di impostare il link della risorsa da utilizzare
     * per l'esecuzione del task
     * 
     * @param val stringa del link
     */
    public void setLink(String val){
        this.link=val;
    }

    /**Il metodo restituisce il comando da utilizzare per l'esecuzione del task
     *
     * @return il comando restituito
     */
    public String getCommand(){
        return this.command;
    }

    /**Il metodo permette di impostare il comando da utilizzare
     * per l'esecuzione del task
     *
     * @param val il comando da eseguire
     */
    public void setCommand(String val){
        this.command=val;
    }
    /** Aggiungi i SO supportati dalla TD
     *
     * @param SO supportati
     */
    public void addSO(String SO){
        this.sistemaOperativo.add(SO);
    }
    /** Aggiungo gli input del TD
     *
     * @param input
     */
    public void addInput(String input){
        this.Inputs.add(input);
    }
    /** Aggiungo gli Output del TD
     *
     * @param output
     */
    public void addOutput(String output){
        this.Outputs.add(output);
    }
    /** Prendo la lista dei SO supportati dal TD
     *
     * @return
     */
    public ArrayList<String> getSO(){
        return this.sistemaOperativo;
    }
    /** Ritorna gli la lista degli Inputs
     *
     * @return ArrayList di Inputs
     */
    public ArrayList<String> getInputs(){
        return this.Inputs;
    }
    /** Ritorna gli la lista degli Outputs
     *
     * @return ArrayList di Outputs
     */
    public ArrayList<String> getOuputs(){
        return this.Outputs;
    }
    /** Ritorna la quantità minima di Ram supportata dal TD espressa in MB
     *
     * @return quantità minima di Ram espressa in MB
     */
    public int getRamMinima(){
        return this.quantitaMinRamMB;
    }
    /** Ritorna il numero di CPU minime necessarie al TD
     *
     * @return quantità minima di CPU
     */
    public int getnCpuMin(){
        return this.nCPUnecessarie;
    }
    /** Ritorna lo spazio occupato dal TD espresso in MB
     *
     * @return lo spazio occupato
     */
    public int getSpazioOccupato(){
        return this.spazioDiscoOccupatoMB;
    }
    /** Override del toString che descrive il TD
     *
     * @return una stringa descrittiva
     */
    @Override
    public String toString(){
        return "TD id="+this.id;
    }
    
     /**STEP 2:
     * Fa parte dei metodi necessari per trasferire le informazioni del vectorClock necessarie per la gestione dell'ordinamento del logging globale.
     * @return vectorClock proveniente dall'entità precedente.
     */
    public HashMap<Integer,Integer> getVectorClock(){
        return this.vectorClock;
    }

    /**STEP 2:
     * Fa parte dei metodi necessari per trasferire le informazioni del vectorClock necessarie per la gestione dell'ordinamento del logging globale.
     * @param vectorClock
     */
    public void setVectorClock(HashMap<Integer,Integer> vectorClock){
        this.vectorClock=vectorClock;
    }
}
